package cn.syy.template;

import cn.hutool.core.util.StrUtil;
import cn.hutool.http.HttpUtil;
import cn.hutool.json.JSON;
import cn.hutool.json.JSONObject;
import cn.hutool.json.JSONUtil;
import cn.syy.propertites.AppSettingProperties;
import lombok.AllArgsConstructor;
import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;


public class AppWeChatTemplate {
    private AppSettingProperties appSettingProperties;

    public AppWeChatTemplate (AppSettingProperties appSettingProperties){
        this.appSettingProperties = appSettingProperties;
    }

    /**
     * 获取openid
     * @param openIdCode
     * @return
     */
    public String getOpenIdByCode(String openIdCode){
        String url = String.format(appSettingProperties.getOpenidUrl(), appSettingProperties.getAppId(), appSettingProperties.getSecret(), openIdCode);
        String jsonString = HttpUtil.get(url); // hutool工具包发送请求的方式，返回的是一个json格式的字符串
        // 判断获取到的结果是否为空
        if(StrUtil.isEmpty(jsonString)){
            throw new RuntimeException("获取openid失败");
        }
        JSONObject codeToOpenIdDto = JSONUtil.parseObj(jsonString);
//        CodeToOpenIdDto codeToOpenIdDto = JsonToClassUtil.objJsonStr2Class(jsonString, CodeToOpenIdDto.class); // 将json对象转换为创建的实体类对象
        String openid = codeToOpenIdDto.getStr("openid");
        if (StrUtil.isEmpty(openid)){
            throw new RuntimeException("获取openid失败");
        }
        // if语句里面如果是抛出异常就使用断言工具类
//        AssertUtil.isNotEmpty(openid,GlobalExceptionCode.PARAM_CODE_ERROR); // 判断openid是否为空，为空的话就抛出异常
//        if (openid.isBlank()){
//            throw new GlobalException(GlobalExceptionCode.PARAM_CODE_ERROR);
//        }
        return openid;
    }

    /**
     * 获取access_token
     * @return
     */
    public String getAccessToken(){
        // 准备正确的发送获取accessToken的请求地址
        String accessTokenUrl = String.format(appSettingProperties.getAccessTokenUrl(), appSettingProperties.getAppId(), appSettingProperties.getSecret());
        // 发送获取accessToken的get请求并且返回的是一个json形式的字符串
        String  resultForAccessToken= HttpUtil.get(accessTokenUrl);
        if (StrUtil.isEmpty(resultForAccessToken)){
            throw new RuntimeException("获取access_token失败");
        }
        // 将json形式的字符串转换为json形式的对象
        JSONObject jsonResult = JSONUtil.toBean(resultForAccessToken, JSONObject.class);
        // 获取json对象里面的access_token的值。并且判断是否为空，为空过的话就抛出异常（字符串形式需要判断是否为null和空值，其他形式就可以只需判断是否为null）
        String accessToken = jsonResult.getStr("access_token");
        if (StrUtil.isEmpty(accessToken)){
            throw new RuntimeException("获取access_token失败");
        }
       return accessToken;
    }

    /**
     * 获取手机号
     * @param phoneCode
     * @return
     */
    public String getPhoneByAccessTokenAndCode(String phoneCode){
        String accessToken = this.getAccessToken();
        // 准备正确的发送获取手机号的请求地址
        String phoneUrl = String.format(appSettingProperties.getPhoneUrl(), accessToken);
        // 发送请求有一个json格式的code参数，所以需要创建一个包含code的json格式的对象
        JSONObject body = new JSONObject();
        body.set("code",phoneCode);
        //发送获取手机号的post请求
        String resultForPhone = HttpUtil.post(phoneUrl, body);
        if (StrUtil.isEmpty(resultForPhone)){
            throw new RuntimeException("获取手机号失败");
        }
        JSONObject jsonResultForPhone = JSONUtil.parseObj(resultForPhone);
        // 获取json对象的errcode字段并且判断是否为0，不为0的话就抛出异常，为0就说明获取正确
        Integer errcode = jsonResultForPhone.getInt("errcode");
        if (0 != errcode){
            throw new RuntimeException("获取手机号失败");
        }
//        AssertUtil.isEquals(0,errcode,GlobalExceptionCode.PARAM_CODE_ERROR);
        // 获取jsonResultForPhone里面的json对象phone_info，并且获取里面的phoneNumber的值（字符串形式），并且判断是否为空，为空就抛出异常
        JSONObject phoneInfo = jsonResultForPhone.getJSONObject("phone_info");
        String phoneNumber = phoneInfo.getStr("phoneNumber");
        if (StrUtil.isEmpty(phoneNumber)){
            throw new RuntimeException("获取手机号失败");
        }
//        AssertUtil.isNotEmpty(phoneNumber,GlobalExceptionCode.PARAM_PHONE_ERROR);
        return phoneNumber;
    }


}
